<!DOCTYPE html>


<html lang="zn-CH">


<head>
  <meta charset="utf-8" />
    
  <meta name="description" content="What I can do is to Do My Personal Best!" />
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>
    面试记录，面试反馈 |  小熊的博客
  </title>
  <meta name="generator" content="hexo-theme-yilia-plus">
  
  <link rel="shortcut icon" href="http://www.cdn.adingxiong.com/b5363a06dc744d79a94021492bcefe27" />
  
  
<link rel="stylesheet" href="/blog/dist/main.css">

  
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Shen-Yu/cdn/css/remixicon.min.css">

  
<link rel="stylesheet" href="/blog/css/custom.css">

  
  
<script src="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>

  
  

  

<link rel="alternate" href="/blog/atom.xml" title="小熊的博客" type="application/atom+xml">
</head>

</html>

<body>
  <div id="app">
    <main class="content on">
      <section class="outer">
  <article id="post-面试题反馈" class="article article-type-post" itemscope
  itemprop="blogPost" data-scroll-reveal>

  <div class="article-inner">
    
    <header class="article-header">
       
<h1 class="article-title sea-center" style="border-left:0" itemprop="name">
  面试记录，面试反馈
</h1>
 

    </header>
    

    
    <div class="article-meta">
      <a href="/blog/2020/04/18/%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%8D%E9%A6%88/" class="article-date">
  <time datetime="2020-04-18T05:47:36.296Z" itemprop="datePublished">2020-04-18</time>
</a>
      
  <div class="article-category">
    <a class="article-category-link" href="/blog/categories/%E9%9D%A2%E8%AF%95/">面试</a>
  </div>

      
      
<div class="word_count">
    <span class="post-time">
        <span class="post-meta-item-icon">
            <i class="ri-quill-pen-line"></i>
            <span class="post-meta-item-text"> Word count:</span>
            <span class="post-count">2.1k</span>
        </span>
    </span>

    <span class="post-time">
        &nbsp; | &nbsp;
        <span class="post-meta-item-icon">
            <i class="ri-book-open-line"></i>
            <span class="post-meta-item-text"> Reading time≈</span>
            <span class="post-count">7 min</span>
        </span>
    </span>
</div>

      
    </div>
    

    
    
    <div class="tocbot"></div>





    

    
    <div class="article-entry" itemprop="articleBody">
      
      

      
      <h3 id="阿里"><a href="#阿里" class="headerlink" title="阿里"></a>阿里</h3><h5 id="1-spring-bean创建的过程？"><a href="#1-spring-bean创建的过程？" class="headerlink" title="1. spring bean创建的过程？"></a>1. spring bean创建的过程？</h5><ol>
<li>BeanDefinition解析：调用容器中的InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法，可以在bean实例化之前修改BeanDefinition</li>
<li>实例化：指的是将BeanDefinition转换成BeanWrapper,然后调用createBeanInstance创建bean实例,Bean的实例化有多种策略，如工厂方法、指定参数构造器和默认无惨构造器等，总之，createBeanInstance方法会返回一个刚好实例化的、属性未复制的空bean对象</li>
<li>属性填充：调用populateBean()方法，为bean注入属性和值</li>
<li>属性填充后置处理： 调用容器的InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法，进行属性填充后置处理</li>
<li>初始化前置处理：调用BeanPostProcesstor的postProcessBeforeInitialization的方法进行初始化前置处理</li>
<li>初始化：调用bean的初始化方法，顺序为InitializingBean的afterPropertiesSet()-&gt;注册init-method</li>
<li>初始化后置处理调用BeanPostProcessor的postProcessAfterInitialization()执行初始化后置处理。</li>
<li>调用registerDisposableBeanIfNecessar(),调用registerDisposableBeanIfNecessary()方法，注册Bean的销毁处理逻辑：将所有实现了DisposableBean接口的或者注册了destroy-method方法的Bean,封装成一个DisposableBean,将其销毁的回调注册到容器中。</li>
</ol>
<h5 id="2-微服务之前调用服务需要注意什么"><a href="#2-微服务之前调用服务需要注意什么" class="headerlink" title="2. 微服务之前调用服务需要注意什么"></a>2. 微服务之前调用服务需要注意什么</h5><p>微服务之间的通讯 ：</p>
<ul>
<li>同步  REST  RPC  </li>
<li>异步  消息队列</li>
</ul>
<p>消息队列中间件如何选型</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">1.协议：AMQP、STOMP、MQTT、私有协议等。</span><br><span class="line">2.消息是否需要持久化。</span><br><span class="line">3.吞吐量。</span><br><span class="line">4.高可用支持，是否单点。</span><br><span class="line">5.分布式扩展能力。</span><br><span class="line">6.消息堆积能力和重放能力。</span><br><span class="line">7.开发便捷，易于维护。</span><br><span class="line">8.社区成熟度。</span><br></pre></td></tr></table></figure>
<p>微服务之间的服务安全 </p>
<p>通过JWT认证方式，确保服务之间的安全可靠</p>
<h5 id="3-hashcode-的原理"><a href="#3-hashcode-的原理" class="headerlink" title="3. hashcode 的原理"></a>3. <code>hashcode</code> 的原理</h5><p><strong><code>hashcode</code>的特性</strong></p>
<ul>
<li>hashcode的存在主要是用于快速查找，如GC查找要回收的对象，hashcode用于确定对象的存储地址</li>
<li>如果两个对象相同，hashcode一定相同 </li>
<li>两个对象hashcode值相同，但是对象不一定相同</li>
</ul>
<h5 id="4-微服务的和普通的模式有什么区别"><a href="#4-微服务的和普通的模式有什么区别" class="headerlink" title="4. 微服务的和普通的模式有什么区别"></a>4. 微服务的和普通的模式有什么区别</h5><h5 id="5-jvm调优，如何调优，一般选用什么工具"><a href="#5-jvm调优，如何调优，一般选用什么工具" class="headerlink" title="5. jvm调优，如何调优，一般选用什么工具"></a>5. jvm调优，如何调优，一般选用什么工具</h5><h5 id="6-synchronized的原理"><a href="#6-synchronized的原理" class="headerlink" title="6. synchronized的原理"></a>6. synchronized的原理</h5><h5 id="7-简单的讲一下java设计模式"><a href="#7-简单的讲一下java设计模式" class="headerlink" title="7. 简单的讲一下java设计模式"></a>7. 简单的讲一下java设计模式</h5><h5 id="8-平时开发是否有查看源码的习惯"><a href="#8-平时开发是否有查看源码的习惯" class="headerlink" title="8.平时开发是否有查看源码的习惯"></a>8.平时开发是否有查看源码的习惯</h5><h5 id="9-并行和并发是什么，如何应对"><a href="#9-并行和并发是什么，如何应对" class="headerlink" title="9. 并行和并发是什么，如何应对"></a>9. 并行和并发是什么，如何应对</h5><h3 id="华为"><a href="#华为" class="headerlink" title="华为"></a>华为</h3><h5 id="1-mysql优化，调优"><a href="#1-mysql优化，调优" class="headerlink" title="1. mysql优化，调优"></a>1. mysql优化，调优</h5><h5 id="2-LocalThread"><a href="#2-LocalThread" class="headerlink" title="2.LocalThread"></a>2.LocalThread</h5><p>线程本地存储，保证多线程情况下不会出现资源共享的问题 。是一种以空间换时间的做饭，在每一个Thread里面维护了一个TheadLocal.ThreadLocalMap吧数据进行隔离，数据不共享，自然就没有线程不安全的问题</p>
<h5 id="3-多线程如何实现通讯"><a href="#3-多线程如何实现通讯" class="headerlink" title="3.多线程如何实现通讯"></a>3.多线程如何实现通讯</h5><p>通过线程阻塞的方式  wait notify,notifyAll()方法<br>lock  停止线程  守护线程 join 方法 优先级  Yield</p>
<h5 id="4-线程的run方法和start方法区别"><a href="#4-线程的run方法和start方法区别" class="headerlink" title="4. 线程的run方法和start方法区别"></a>4. 线程的run方法和start方法区别</h5><p>run方法和普通的方法是相同的 ，同步按照顺序执行，启动的是主线程，而start方法是异步的<br>可以同时创建多个线程</p>
<h5 id="5-mysql中的distinct和order-by-的区别"><a href="#5-mysql中的distinct和order-by-的区别" class="headerlink" title="5.mysql中的distinct和order by 的区别"></a>5.mysql中的distinct和order by 的区别</h5><h5 id="6-分库分表的原理"><a href="#6-分库分表的原理" class="headerlink" title="6.分库分表的原理"></a>6.分库分表的原理</h5><h5 id="7-场景（关联查询一个是数据库多一个数据少，谁在左谁在右）"><a href="#7-场景（关联查询一个是数据库多一个数据少，谁在左谁在右）" class="headerlink" title="7. 场景（关联查询一个是数据库多一个数据少，谁在左谁在右）"></a>7. 场景（关联查询一个是数据库多一个数据少，谁在左谁在右）</h5><p>数据少得是主表 数据多的当做附表</p>
<h5 id="8-集合的种类和他的实现类-和如何去选择，讲讲区别和原理"><a href="#8-集合的种类和他的实现类-和如何去选择，讲讲区别和原理" class="headerlink" title="8. 集合的种类和他的实现类  和如何去选择，讲讲区别和原理"></a>8. 集合的种类和他的实现类  和如何去选择，讲讲区别和原理</h5><h5 id="9-线程池创建以及需要注意哪些东西"><a href="#9-线程池创建以及需要注意哪些东西" class="headerlink" title="9. 线程池创建以及需要注意哪些东西"></a>9. 线程池创建以及需要注意哪些东西</h5><ul>
<li>核心线程数量 </li>
<li>线程池的最大长度</li>
<li>线程最大空闲时间</li>
<li>时间单位</li>
<li>工作队列</li>
<li>创建线程的线程工厂</li>
<li>到达线程长度上线的拒绝策略</li>
</ul>
<h5 id="10-了解哪些设计模式，有多少种"><a href="#10-了解哪些设计模式，有多少种" class="headerlink" title="10 .了解哪些设计模式，有多少种"></a>10 .了解哪些设计模式，有多少种</h5><h5 id="11-泛型存在的时期"><a href="#11-泛型存在的时期" class="headerlink" title="11 .泛型存在的时期"></a>11 .泛型存在的时期</h5><p>泛型只存在于编译期  </p>
<h5 id="12-线程池的种类"><a href="#12-线程池的种类" class="headerlink" title="12.线程池的种类"></a>12.线程池的种类</h5><ul>
<li>单例线程池 </li>
<li>固定大小线程池</li>
<li>缓存线程池</li>
<li>定时线程池</li>
</ul>
<h3 id="爱德数智"><a href="#爱德数智" class="headerlink" title="爱德数智"></a>爱德数智</h3><h5 id="1-什么情况是值传递什么情况是引用传递？"><a href="#1-什么情况是值传递什么情况是引用传递？" class="headerlink" title="1. 什么情况是值传递什么情况是引用传递？"></a>1. 什么情况是值传递什么情况是引用传递？</h5><ul>
<li>基本数据类型是值传递</li>
<li>引用类型是引用传递</li>
<li>传递的相当于原数据的一个副本，不影响原数据</li>
</ul>
<h5 id="2-Integer是否可以用"><a href="#2-Integer是否可以用" class="headerlink" title="2. Integer是否可以用 =="></a>2. Integer是否可以用 ==</h5><p>在一定范围是成立的  -127到127</p>
<h5 id="3-IO的包使用的设计模式"><a href="#3-IO的包使用的设计模式" class="headerlink" title="3. IO的包使用的设计模式"></a>3. IO的包使用的设计模式</h5><p>适配器模式<br>装饰器模式</p>
<h5 id="3-枚举的特性"><a href="#3-枚举的特性" class="headerlink" title="3. 枚举的特性"></a>3. 枚举的特性</h5><ol>
<li>举实例必须在 enum关键字声明的类中显式的指定(首行开始的以第一个分号结束)</li>
<li>除了1, 没有任何方式(new,clone,反射,序列化)可以手动创建枚举实例</li>
<li>枚举类不可被继承</li>
<li>枚举类是线程安全的</li>
<li>枚举类型是类型安全的(typesafe)</li>
<li>无法继承其他类(已经默认继承Enum)</li>
</ol>
<h5 id="4-springboot特有的注解"><a href="#4-springboot特有的注解" class="headerlink" title="4. springboot特有的注解"></a>4. springboot特有的注解</h5><h5 id="5-springboot的启动方式有几种"><a href="#5-springboot的启动方式有几种" class="headerlink" title="5. springboot的启动方式有几种"></a>5. springboot的启动方式有几种</h5><ol>
<li>application 启动类</li>
<li>mvn插件 </li>
<li>java 启动 </li>
<li>maven build</li>
</ol>
<h5 id="6-mybatisplus-插件"><a href="#6-mybatisplus-插件" class="headerlink" title="6. mybatisplus  插件"></a>6. mybatisplus  插件</h5><ol>
<li>自动生成 </li>
<li>分页 </li>
<li>关联查询 </li>
<li>性能分析</li>
<li>全局拦截</li>
<li>sql防止注入</li>
</ol>
<h5 id="7-mybatisplus的分页插件底层原理"><a href="#7-mybatisplus的分页插件底层原理" class="headerlink" title="7.mybatisplus的分页插件底层原理"></a>7.mybatisplus的分页插件底层原理</h5><p>拦截器机制</p>
<h5 id="8-spring注解相关"><a href="#8-spring注解相关" class="headerlink" title="8. spring注解相关"></a>8. spring注解相关</h5><ul>
<li>包扫描  @Component</li>
<li>数据层注解 @Reposity</li>
<li>服务层注解 @Service</li>
<li>控制层注解  @COntroller</li>
</ul>
<h5 id="9-spring框架的特性"><a href="#9-spring框架的特性" class="headerlink" title="9.spring框架的特性"></a>9.spring框架的特性</h5><ul>
<li>方便解耦，通过IOC实现了简化开发</li>
<li>AOP编程的支持通过Spring提供的AOP功能，方便进行面向切面的编程。</li>
<li>声明事物的支持在Spring中，我们可以从单调烦闷的事务管理代码中解脱出来，通过声明式方式灵活           地进行事务的管理，提高开发效率和质量。</li>
<li>方便程序的测试可以用非容器依赖的编程方式进行几乎所有的测试工作</li>
<li>集成其它的优秀框架<h5 id="10-IOC和AOP实现原理"><a href="#10-IOC和AOP实现原理" class="headerlink" title="10. IOC和AOP实现原理"></a>10. IOC和AOP实现原理</h5></li>
</ul>
<h5 id="11-bean对象的实现方式过程，如何实现bean对象注入是否可以通过new的方式实现"><a href="#11-bean对象的实现方式过程，如何实现bean对象注入是否可以通过new的方式实现" class="headerlink" title="11. bean对象的实现方式过程，如何实现bean对象注入是否可以通过new的方式实现"></a>11. bean对象的实现方式过程，如何实现bean对象注入是否可以通过new的方式实现</h5><h3 id="xxxxx"><a href="#xxxxx" class="headerlink" title="xxxxx"></a>xxxxx</h3><h5 id="1-分开分表的策略"><a href="#1-分开分表的策略" class="headerlink" title="1. 分开分表的策略"></a>1. 分开分表的策略</h5><hr>
<p>a. 分库分表重用中间件有哪些  （常用的是后面两个）</p>
<ul>
<li>cobar</li>
<li>TDDL</li>
<li>atlas</li>
<li>sharding-jdc  △</li>
<li>mycat  △  </li>
</ul>
<hr>
<p>b. 如何理解水平拆分和垂直拆分 </p>
<p><strong>水平拆分</strong> :将一张表的数据拆分到多个库多个表中，没张表的数据接口相同，数据不相同，所以数据加起来等于之前那张表的数据<br><strong>垂直拆分</strong>： 将一张表的字段拆分到多个表或者多个库里面 </p>
<h5 id="2-分库分表的遇到统计查询的如何处理（跨表连接）"><a href="#2-分库分表的遇到统计查询的如何处理（跨表连接）" class="headerlink" title="2. 分库分表的遇到统计查询的如何处理（跨表连接）"></a>2. 分库分表的遇到统计查询的如何处理（跨表连接）</h5><h5 id="3-spring中的bean的创建过程"><a href="#3-spring中的bean的创建过程" class="headerlink" title="3. spring中的bean的创建过程"></a>3. spring中的bean的创建过程</h5><h5 id="4-事务管理如何实现（注解事务是如何实现）"><a href="#4-事务管理如何实现（注解事务是如何实现）" class="headerlink" title="4. 事务管理如何实现（注解事务是如何实现）"></a>4. 事务管理如何实现（注解事务是如何实现）</h5><h5 id="5-事务的开启-、-提交-、回滚是如何实现的"><a href="#5-事务的开启-、-提交-、回滚是如何实现的" class="headerlink" title="5. 事务的开启 、 提交 、回滚是如何实现的"></a>5. 事务的开启 、 提交 、回滚是如何实现的</h5><h5 id="6-spring事务管理器-管理事务的原理"><a href="#6-spring事务管理器-管理事务的原理" class="headerlink" title="6. spring事务管理器  管理事务的原理"></a>6. spring事务管理器  管理事务的原理</h5><h5 id="7-aop实现的原理"><a href="#7-aop实现的原理" class="headerlink" title="7. aop实现的原理"></a>7. aop实现的原理</h5><h5 id="9-并发和线程安全出现的问题场景"><a href="#9-并发和线程安全出现的问题场景" class="headerlink" title="9. 并发和线程安全出现的问题场景"></a>9. 并发和线程安全出现的问题场景</h5><ol>
<li>如果我们创建多个线程，就会存在数据共享的问题，也就是线程安全的问题；当一个线程操作数据的时候，还没有结束另外一个线程就会参与会导致数据出现安全性的问题 </li>
<li>通过加锁的形式 synchronized 和lock的形式进行加锁，只有一个线程对该数据可以操作</li>
</ol>
<p><strong>并发编程三要素</strong></p>
<ul>
<li>原子性： 所以的操作是不可中断的 要么全部成功 要么全部失败 </li>
<li>有序行： 程序执行的顺序是按照代码的先后顺序完成的</li>
<li>可见性： 当多个线程访问同一个变量的时候，如何一个线程修改了该数据，其它线程获取到的应该是最新的数据<h5 id="10-如何保证多线程提交保证事务安全-通过什么方式实现事务同步（共享什么东西）"><a href="#10-如何保证多线程提交保证事务安全-通过什么方式实现事务同步（共享什么东西）" class="headerlink" title="10. 如何保证多线程提交保证事务安全  通过什么方式实现事务同步（共享什么东西）"></a>10. 如何保证多线程提交保证事务安全  通过什么方式实现事务同步（共享什么东西）</h5>共用同一个数据库连接</li>
</ul>
<h5 id="11-sql中where后面条件的执行顺序"><a href="#11-sql中where后面条件的执行顺序" class="headerlink" title="11. sql中where后面条件的执行顺序"></a>11. sql中where后面条件的执行顺序</h5><p>where条件后面的语句的执行顺序是从左到右，所以排除越多的条件放在越前面</p>
<h5 id="12-创建索引的原则"><a href="#12-创建索引的原则" class="headerlink" title="12. 创建索引的原则"></a>12. 创建索引的原则</h5><ol>
<li>查询评率高的字段</li>
<li>对于排序、分组、联合查询频率高的字段 </li>
<li>索引创建太多，是影响update和insert的效率 </li>
<li>若实践中，需要将多列字段设置为索引的时候可以创建多列索引</li>
<li>选择数据唯一的字段创建索引</li>
<li>创建索引值的时候尽量使用数据长度小的字段 </li>
</ol>

      
      <!-- reward -->
      
      <div id="reward-btn">
        Donate
      </div>
      
    </div>
    
    
      <!-- copyright -->
      
        <div class="declare">
          <ul class="post-copyright">
            <li>
              <i class="ri-copyright-line"></i>
              <strong>Copyright： </strong>
              Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
            </li>
          </ul>
        </div>
        
    <footer class="article-footer">
      
          
<div class="share-btn">
      <span class="share-sns share-outer">
        <i class="ri-share-forward-line"></i>
        分享
      </span>
      <div class="share-wrap">
        <i class="arrow"></i>
        <div class="share-icons">
          
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="ri-weibo-fill"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="ri-wechat-fill"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="ri-qq-fill"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="ri-douban-line"></i>
          </a>
          <!-- <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a> -->
          
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="ri-facebook-circle-fill"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="ri-twitter-fill"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="ri-google-fill"></i>
          </a>
        </div>
      </div>
</div>

<div class="wx-share-modal">
    <a class="modal-close" href="javascript:;"><i class="ri-close-circle-line"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="//api.qrserver.com/v1/create-qr-code/?size=150x150&data=https://bodboy.gitee.io/blog/2020/04/18/%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%8D%E9%A6%88/" alt="微信分享二维码">
    </div>
</div>

<div id="share-mask"></div>
      
      
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/blog/tags/java/" rel="tag">java</a></li></ul>


    </footer>

  </div>

  
  
  <nav class="article-nav">
    
      <a href="/blog/2020/04/18/sql%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95%E5%90%88%E9%9B%86/" class="article-nav-link">
        <strong class="article-nav-caption">上一篇</strong>
        <div class="article-nav-title">
          
            sql常用语法合集
          
        </div>
      </a>
    
    
      <a href="/blog/2020/04/18/%E9%9D%A2%E8%AF%95%E5%9F%BA%E7%A1%80%E9%A2%98/" class="article-nav-link">
        <strong class="article-nav-caption">下一篇</strong>
        <div class="article-nav-title">java基础面试题</div>
      </a>
    
  </nav>


  

  
  
<!-- valine评论 -->
<div id="vcomments-box">
    <div id="vcomments">
    </div>
</div>
<script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
<script src='https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js'></script>
<script>
    new Valine({
        el: '#vcomments',
        app_id: 'uW8QYGvvhWmNWdiwpznJ0GVa-gzGzoHsz',
        app_key: 'LrJhMzx9qEwcMV1DJjTI6f6C',
        path: window.location.pathname,
        notify: 'false',
        verify: 'false',
        avatar: '[object Object]',
        placeholder: '给我的文章加点评论吧~',
        recordIP: true
    });
    const infoEle = document.querySelector('#vcomments .info');
    if (infoEle && infoEle.childNodes && infoEle.childNodes.length > 0) {
        infoEle.childNodes.forEach(function (item) {
            item.parentNode.removeChild(item);
        });
    }
</script>
<style>
    #vcomments-box {
        padding: 5px 30px;
    }

    @media screen and (max-width: 800px) {
        #vcomments-box {
            padding: 5px 0px;
        }
    }

    #vcomments-box #vcomments {
        background-color: #fff;
    }

    .v .vlist .vcard .vh {
        padding-right: 20px;
    }

    .v .vlist .vcard {
        padding-left: 10px;
    }
</style>

  

  
  
  
  
  

</article>
</section>
      <footer class="footer">
  <div class="outer">
    <ul>
      <li>
        Copyrights &copy;
        2019-2021
        <i class="ri-heart-fill heart_icon"></i> panda
      </li>
    </ul>
    <ul>
      <li>
        
        
        
        Powered by <a href="https://hexo.io" target="_blank">Hexo</a>
        <span class="division">|</span>
        Theme - <a href="https://github.com/Shen-Yu/hexo-theme-ayer" target="_blank">Ayer</a>
        
      </li>
    </ul>
    <ul>
      <li>
        
        
        <span>
  <span><i class="ri-user-3-fill"></i>Visitors:<span id="busuanzi_value_site_uv"></span></s>
  <span class="division">|</span>
  <span><i class="ri-eye-fill"></i>Views:<span id="busuanzi_value_page_pv"></span></span>
</span>
        
      </li>
    </ul>
    <ul>
      
    </ul>
    <ul>
      <li>
        <!-- cnzz统计 -->
        
        <script type="text/javascript" src='https://s9.cnzz.com/z_stat.php?id=1278069914&amp;web_id=1278069914'></script>
        
      </li>
    </ul>
  </div>
</footer>
      <div class="float_btns">
        <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>

<div class="todark" id="todark">
  <i class="ri-moon-line"></i>
</div>

      </div>
    </main>
    <aside class="sidebar on">
      <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/blog/"><img src="https://portrait.gitee.com/uploads/avatars/user/1007/3023420_bodboy_1578973210.png!avatar200" alt="小熊的博客"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/archives">归档</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/categories">分类</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/tags/%E6%97%85%E8%A1%8C/">旅行</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/blog/about">关于我</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      <a class="nav-item-link nav-item-search"  title="Search">
        <i class="ri-search-line"></i>
      </a>
      
      
      <a class="nav-item-link" target="_blank" href="/blog/atom.xml" title="RSS Feed">
        <i class="ri-rss-line"></i>
      </a>
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
    </aside>
    <script>
      if (window.matchMedia("(max-width: 768px)").matches) {
        document.querySelector('.content').classList.remove('on');
        document.querySelector('.sidebar').classList.remove('on');
      }
    </script>
    <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>请我喝杯咖啡吧~</p>
  <div class="reward-box">
    
    <div class="reward-item">
      <img class="reward-img" src="/blog/images/alipay.jpg">
      <span class="reward-type">支付宝</span>
    </div>
    
    
    <div class="reward-item">
      <img class="reward-img" src="/blog/images/wechat.jpg">
      <span class="reward-type">微信</span>
    </div>
    
  </div>
</div>
    
<script src="/blog/js/jquery-2.0.3.min.js"></script>


<script src="/blog/js/lazyload.min.js"></script>


<script>
  try {
    var typed = new Typed("#subtitle", {
      strings: ['面朝大海，春暖花开', '愿你一生努力，一生被爱', '想要的都拥有，得不到的都释怀'],
      startDelay: 0,
      typeSpeed: 200,
      loop: true,
      backSpeed: 100,
      showCursor: true
    });
  } catch (err) {
  }

</script>




<script src="/blog/js/tocbot.min.js"></script>

<script>
  // Tocbot_v4.7.0  http://tscanlin.github.io/tocbot/
  tocbot.init({
    tocSelector: '.tocbot',
    contentSelector: '.article-entry',
    headingSelector: 'h1, h2, h3, h4, h5, h6',
    hasInnerContainers: true,
    scrollSmooth: true,
    scrollContainer: 'main',
    positionFixedSelector: '.tocbot',
    positionFixedClass: 'is-position-fixed',
    fixedSidebarOffset: 'auto'
  });
</script>



<script src="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.css">
<script src="https://cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/js/jquery.justifiedGallery.min.js"></script>

<script src="/blog/dist/main.js"></script>



<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.min.css">
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script>


<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
      tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
  });

  MathJax.Hub.Queue(function() {
      var all = MathJax.Hub.getAllJax(), i;
      for(i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
      }
  });
</script>

<script src="https://cdn.jsdelivr.net/npm/mathjax@2.7.6/unpacked/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script>
  var ayerConfig = {
    mathjax: true
  }
</script>




<script src="/blog/js/busuanzi-2.3.pure.min.js"></script>



<script type="text/javascript" src="https://js.users.51.la/20544303.js"></script>

  
<script src="/blog/js/clickLove.js"></script>



<!-- 复制 -->



    
    <div id="music">
    
    
    
    <iframe frameborder="no" border="1" marginwidth="0" marginheight="0" width="200" height="52"
        src="//music.163.com/outchain/player?type=2&id=1297802566&auto=1&height=32"></iframe>
</div>

<style>
    #music {
        position: fixed;
        right: 15px;
        bottom: 0;
        z-index: 998;
    }
</style>
    
  </div>
</body>

</html>